/***
Para la recepcion de los datos
*/
/////////////////////////////////////////////////////////////////

var General = {
    ERROR : 0,
    EXITO : 1,
    SINACCESO : 2,
    NOSESSION : 3,
    PAGE_NOSESSION : "",
};
/////////////////////////////////////////////////////////////////

var Urls = function () {
    this.List = "";
    this.Form = "";
    this.Register = "";
    this.Eliminar = "";

    this.width = "";
    this.height = "";
};

function Mantenimiento() {
    this.Init = function (Cont, Urls, Modo) {
        //Prefijo
        this._Prefijo = "";

        var _parent = this;
        //Tres modos Slide, Modal, All
        this._ModoNavegacion = (Modo) ? Modo : "Slide";

        //Formulario y List
        //Es requisito que dentro del formulario se tiene un objeto con el id de aceptar
        //que sirve para enviar a registrar los datos del formulario
        this._Cont = Cont;
        if (this._Cont.attr("prefijo")) {
            this._Prefijo = this._Cont.attr("prefijo");
        }
        this.SetAttr();

        //Urls
        this._UrlList = Urls.List;
        this._UrlForm = Urls.Form;
        this._UrlRegister = Urls.Register;
        this._UrlEliminar = Urls.Eliminar;

        //Width y Height para el formulario
        this._Width = Urls.width;
        this._Height = Urls.height;
        this._Titulo = Urls.titulo;

        //Ejecutando el PreInit
        this.PreInit();
        this.InitNavegacion();
        this.Search();


        //Aceptar Nuevo y Editar
        //Creando la accion asociada al evento patron Observer
        if(Modo != "Modal"){
            this._ContForm.find("#" + this._Prefijo + "_aceptar").expire();
            this._ContForm.find("#" + this._Prefijo + "_aceptar").livequery("click", function () {
                _parent.Register();
            });
        }


        //La Opcion de listar
        this._ContList.find("#" + this._Prefijo + "_ListForm").expire();
        this._ContList.find("#" + this._Prefijo + "_ListForm").livequery("submit", function () {
            //llamando al ajax para el guardado
            $(this).attr("action", _parent._UrlList);
            $(this).ajaxSubmit({
                success: function (responseText, statusTexts, xhr, $form) {
                    _parent._ContList.html(responseText);
                    _parent.SetAttr();
                }
            });
            return false;
        });

        //La Opcion de listar
        this._ContList.find("." + this._Prefijo + "_Paginador").off();
        this._ContList.find("." + this._Prefijo + "_Paginador").on("click", function () {
            _parent._ContList.find("#pagina").val($(this).attr("data-pagina"));
            _parent.List();
        });
    };

    //Seteando los atributos cadavez que lo necesitemos
    this.SetAttr = function () {
        //Concatenando el prefijo
        this._ContForm = this._Cont.find("#" + this._Prefijo + "_ContForm");
        this._Form = this._ContForm.find("#" + this._Prefijo + "_Form");
        this._ContList = this._Cont.find("#" + this._Prefijo + "_ContList");
        this._List = this._ContList.find("#" + this._Prefijo + "_List");

        //Para la paginacion
        this._ListForm = this._ContList.find("#" + this._Prefijo + "_ListForm");
        //Para las busquedas
        this._ContToolList = this._Cont.find("#" + this._Prefijo + "_ContToolList");

        //Eliminando el envio de datos por submit
        this._Form.on("submit", function(){
            return false;
        });
    }

    this.PreInit = function () {
        return true;
    };


    //Buscador el listado debe tener un formualrio
    this.Search = function () {
        var _parent = this;
        this._ContToolList.find("#cadena").on("keypress", function (event) {
            if (event.which == 13) {
                _parent._ContList.find("#pagina").val(1);
                _parent._ContList.find("#cadena").val(_parent._ContToolList.find("#cadena").val());
                _parent.List();
                _parent.ShowList();
            }
        });
    };

    //Mostrando el listado para nuevo y editar
    //Cargando el listado
    this.List = function (data) {
        var _parent = this;
        //Verificando si existe el formulario

        if (this._ContList.find("#" + this._Prefijo + "_ListForm").length != 0) {
            this._ContList.find("#" + this._Prefijo + "_ListForm").submit();
        } else {
            $.ajax({
                // Autor.
                url: this._UrlList,
                type: "post",
                data: data,
                success: function (data) {
                    _parent._ContList.html(data);
                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                }
            });
        }
    };

    //Mostrando el formulario para nuevo y editar
    this.Form = function (data) {
        var _parent = this;
        $.ajax({
            // Autor
            url: _parent._UrlForm,
            type: "post",
            data: data,
            success: function (data) {
                _parent.FormNavegacion(data);
            }
        });
    };

    //La operacion de registrar ya sea para agregar o guardar, 
    //contiene un Validate y un PostRegister que deberian ser personalizables

    this.__Validate = function () {
        return true;
    };

    this.__PostRegister = function (data) {
        return true;
    }


    this.ValidaSession = function (data) {
        //Esto es en caso no exista el objeto del formato especificado
        return true;
    }

    //Operacion despues de registrar el evento
    this.PostRegisterNavegacion = function (data) {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                //_parent     
                _parent.RecepcionDataDepuesDelProcesoDelForm(data);
                _parent.List();
                break;

            case "All":
                _parent.RecepcionDataDepuesDelProcesoDelForm(data);
                _parent.List();
                break;

            case "Modal":
                _parent.List();
                break;

            case "FormuUnico":

            break;
        }
    };

    //Seteo los campos del formulario con el objeto que me devuelve el servidor
    //en formato json me servira cuando se inserta un nuevo registro
    this.RecepcionDataDepuesDelProcesoDelForm = function (data) {
        var obj = jQuery.parseJSON(data);
        var contForm = this._Form;
        
        $.each(obj.objeto, function (index, value) {
            contForm.find("#" + index).val(value);
        });
        return true;
    };

    this.Register = function (data) {
    
        var _parent = this; 

        if (!this.__Validate())
            return;

        this._Form.attr("action", this._UrlRegister);

        this._Form.ajaxSubmit({
            success: function (responseText, statusTexts, xhr, $form) {
                
                //Es la accion basica que se realiza cuando registramos en el formulario        
                _parent.PostRegisterNavegacion(responseText);

                //Este metodo es customizable para una logica especifica
                _parent.__PostRegister(responseText);
            }
        });           
        
    };

    this.__PostCloseDialog = function(data){
        return true;
    };

    this.__PreOpenDialog = function(data){
         return true;
    }

    this.FormNavegacion = function (data) {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                _parent._ContList.slideUp(function () {
                    _parent._ContForm.html(data);
                    _parent._ContForm.slideDown();

                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                });
                break;

            case "All":
                _parent._ContForm.html(data);
                _parent.SetAttr();
                break;

            case "Modal":
                
                //Creando el div modal para cada tipo de entidad               
                var temp = $("<div>");
                temp.attr("class","window-modal displar-none");                

                //Agregando el modal en el Body
                $('body').append(temp);
                var tempDiv = $('body div.window-modal').last();
                

                //Agregando esto para actulizar el polifill de la capa
                //es decir que siga con las funcionalidades del HTML5
                tempDiv.append(data).updatePolyfill();
                _parent._Form = tempDiv.find("form");

                tempDiv.dialog({
                    autoOpen: false,
                    width: _parent._Width,
                    maxheight:_parent._Height,
                    resizable: false,
                    modal: true,
                    show: 'slide',
                    hide: 'slide',
                    position: ['center',100],
                    title: _parent._Titulo,
                    open: function (event, ui) {

                        //Cuando se comienza abrir el popup
                        _parent.__PreOpenDialog(tempDiv);
                        
                        //Para cerrar el formulario haciendo click fuera del
                        //Formulario
                        var parent = $(this);
                        $('.ui-widget-overlay').click(function () {
                            parent.dialog("close");
                        })

                        //Para guardar el formulario
                        tempDiv.find("#aceptar").bind("click", function () {
                            //Registrando                            
                            _parent.Register();
                            //Cerrando
                            parent.dialog("close");                            

                        });

                        //Para Cerrar el formulario
                        tempDiv.find("#cancelar").bind("click", function () {
                            tempDiv.html("");
                            parent.dialog("close");
                        });

                        
                    },

                    close: function (event, ui) { 
                        //Metodos que hacemos antes de cerrar el modal                        
                        _parent.__PostCloseDialog();
                        tempDiv.remove();
                    }
                });

                //Abriendo el dialog
                tempDiv.dialog("open");
            break;
        }
    };

    //
    //El iniciaizador de estos primeramente es para el modo slide
    //debe tener el id _CerrarModo
    this.InitNavegacion = function (data) {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                if (_parent._Cont.find("#" + this._Prefijo + "_CerrarModo")) {
                    _parent._Cont.find("#" + this._Prefijo + "_CerrarModo").on("click", function () {
                        _parent._ContForm.slideUp(function () {
                            _parent._ContList.slideDown();
                        });
                    })
                }
                break;
            case "All":
                break;
        }
    };

    this.ShowList = function () {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                _parent._ContForm.slideUp(function () {
                    _parent._ContList.slideDown();
                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                });
                break;

            case "All":
                _parent.SetAttr();
                break;
        }
    };

    //Obtener Atributos de un objeto
    this.GetAttrAJson = function (obj) {
        _data = {};
        $.each(obj.attributes, function (index, value) {
            if (value.name != "class") {
                var _tempName = value.name.replace("data-", "");
                _data[_tempName] = value.value;
            }
        });
        return _data;
    }
}